package ru.spb.nicetu.altx.mnemo.utils.widgets;

import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Базовый класс для элементов редактирования значений полей команды
 */
public abstract class AFieldComposite extends Composite {
  //**************************************************************************//
  //                        Enums                                             //
  //**************************************************************************//

  //**************************************************************************//
  //                        Members                                           //
  //**************************************************************************//
  private Object mLayoutData;
  //**************************************************************************//
  //                        Constructors                                      //
  //**************************************************************************//
  public AFieldComposite(Composite parent, int style) {
    super(parent, style);

    GridLayout valueLayout = new GridLayout(1, false);
    this.setLayout(valueLayout);

    createControls(this, style);
  }
  //**************************************************************************//
  //                        Getters                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Setters                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Publics                                           //
  //**************************************************************************//
  public void setFieldLayoutData(Object layoutData) {
    this.mLayoutData = layoutData;
  }
  
  /**
   * Селектор флага корректности поля ввода
   * @return
   */
  public Boolean isCorrect() {
	return true;
  }
  
  public String getErrorDescription() {
	return "";  
  }
  //**************************************************************************//
  //                        Abstracts                                         //
  //**************************************************************************//
  abstract public void addFieldModifyListener (ModifyListener listener);

  abstract protected void createControls(Composite parent, int style);
  
  abstract public boolean getFieldEnable();
  abstract public void    setFieldEnable(boolean enable);
  //**************************************************************************//
  //                        Protected                                         //
  //**************************************************************************//

  /**
   * Создание декоратора на поле ввода, который
   * появляется при некорректном вводе
   */
  protected ControlDecoration createDecorator(Control control) {
		ControlDecoration controlDecoration = new ControlDecoration(control,
				SWT.LEFT | SWT.TOP);
		FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
				.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
		controlDecoration.setImage(fieldDecoration.getImage());
		controlDecoration.hide();
		controlDecoration.setShowHover(true);
		return controlDecoration;
  }
  
  //**************************************************************************//
  //                        Privates                                          //
  //**************************************************************************//

  //**************************************************************************//
  //                        Public Statics                                    //
  //**************************************************************************//

  //**************************************************************************//
  //                        Private Statics                                   //
  //**************************************************************************//

  //**************************************************************************//
  //                        Internal Classes                                  //
  //**************************************************************************//
}
